/**
 * JS有8中数据类型（7中原始类型，1种引用类型）。
 * 原始类型：null, undefined, boolean, number, string, symbol, bigInt。
 * 引用类型：object(对象，数组，函数)。
 */

/**
 * 【number类型】：代表整数和浮点数，Infinity、-Infinity、NaN也都是number类型。
 * Infinity表示数学概念中的正无穷大，是一个比任何数字都大的特殊值。
 * -Infinity表示数学概念中的负无穷大，是一个比任何数字都小的特殊值。
 * NaN代表一个计算错误。它是一个不正确或一个未定义的数学操作所得到的结果。NaN是粘性的，任何对NaN的进一步计算都会返回NaN（只有一个例外：NaN ** 0 结果为 1）。
 */
let n = 123
n = 3.14

/**
 * 【bigInt类型】：通过将 n 附加到整数字段的末尾来创建 BigInt 值。用于表示任意长度的整数。
 * 在JS中number类型无法安全地表示大于 (2^53 - 1) 即 9007199254740991，或小于 -(2^53 - 1) 的整数。
 * number类型可以存储最大的整数（最多 1.7976931348623157 * 10^308），但超出这个范围的整数会出现精度问题。
 * 也就是说，所有大于 (2^53 - 1) 的奇数都不能用 “number” 类型存储。
 */
const bigInt = 123456789123456789123456789123456789n

/**
 * 【null类型】：表示有值，但其值为空的特殊值。
 */
let age = null // 表示age是未知的

/**
 * 【undefined类型】：表示未被赋值，如果一个变量已被声明，但未被赋值，那么它的值就是undefined。
 */
let msg
console.log(msg) // undefined

/**
 * 【typeof运算符】：返回参数的数据类型。
 */
console.log(typeof undefined) // undefined
console.log(typeof 0) // number
console.log(typeof 10n) // bigint
console.log(typeof true) // boolean
console.log(typeof 'foo') // string
console.log(typeof Symbol('id')) // symbol
console.log(typeof Math) // object（内建对象）
console.log(typeof null) // object（设计上的失误，官方承认的错误，为了兼容性保留了下来）
console.log(typeof alert) // function（JS中并没有“function”类型，函数隶属于object类型，但是typeof会对函数区分对待，行为是不正确的，但在实际编程中非常方便）
